module.exports = function(grunt) {
    var pkg = grunt.file.readJSON("package.json"),
        chalk = require("chalk"),
        env = process.env.NODE_ENV,
        currentEnv = process.env.CURRENT_ENV,
        json = require("./bin/gruntConfig")(pkg, env, grunt, currentEnv),
        template = require("./bin/template")(grunt, env, currentEnv, chalk, pkg),
        filerev = require("./bin/filerev")(grunt, env, chalk);
    grunt.log.writeln("Current: " + chalk.cyan(currentEnv));

    grunt.initConfig(json);
    grunt.registerTask("serve", [
        "clean:development",
        "copy:development",
        "uglify:public",
        "cssmin:public",
        "less:development",
        "babel:development",
        "hash:js",
        "hash:css",
        "hash:img",
        "template:public",
        "htmlmin:development",
        "filerev:html",
        "filerev:css",
        "filerev:js",
        "connect:server",
        "watch:development",
    ]);
    grunt.registerTask("dev", [
        "clean:development",
        "copy:development",
        "uglify:public",
        "cssmin:public",
        "less:development",
        "babel:development",
        "hash:js",
        "hash:css",
        "hash:img",
        "template:public",
        "htmlmin:development",
        "filerev:html",
        "filerev:css",
        "filerev:js",
        "zip:public",
    ]);
    grunt.registerTask("prod", [
        "clean:production",
        "copy:production",
        "uglify:public",
        "cssmin:public",
        "less:production",
        "babel:production",
        "uglify:production",
        "hash:js",
        "hash:css",
        "hash:img",
        "template:public",
        "htmlmin:production",
        "filerev:html",
        "filerev:css",
        "filerev:js",
        "zip:public",
    ]);
    grunt.registerTask("test", [
        "clean:test",
        "copy:test",
        "uglify:public",
        "cssmin:public",
        "less:test",
        "babel:test",
        "uglify:public",
        "hash:js",
        "hash:css",
        "hash:img",
        "template:public",
        "htmlmin:test",
        "filerev:html",
        "filerev:css",
        "filerev:js",
        "zip:public",
    ]);
    grunt.registerTask("preprod", [
        "clean:preproduction",
        "copy:preproduction",
        "uglify:public",
        "cssmin:public",
        "less:preproduction",
        "babel:preproduction",
        "uglify:public",
        "hash:js",
        "hash:css",
        "hash:img",
        "template:public",
        "htmlmin:preproduction",
        "filerev:html",
        "filerev:css",
        "filerev:js",
        "zip:public",
    ]);

    grunt.loadNpmTasks("grunt-contrib-clean");
    grunt.loadNpmTasks("grunt-contrib-watch");
    grunt.loadNpmTasks("grunt-contrib-copy");
    grunt.loadNpmTasks("grunt-contrib-uglify");
    //grunt.loadNpmTasks("grunt-contrib-concat");
    grunt.loadNpmTasks("grunt-contrib-cssmin");
    grunt.loadNpmTasks("grunt-contrib-less");
    // grunt.loadNpmTasks("grunt-contrib-sass");
    grunt.loadNpmTasks("grunt-contrib-htmlmin");
    grunt.loadNpmTasks("grunt-contrib-connect");
    grunt.loadNpmTasks("grunt-babel");
    //grunt.loadNpmTasks("grunt-shell");
    grunt.loadNpmTasks("grunt-zip");
    grunt.loadNpmTasks("grunt-hash");
    //grunt.loadNpmTasks("grunt-usemin");
};